package learn.socket.client;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;

/**
 * 若对方没有向自己发送数据，则自定义处理器建议继承自ChannelInboundHandlerAdapter。因为不需要重写channelRead0方法
 * 若对方向自己发送了数据，而自己又需要将该数据再次发送给对方，则建议继承ChannelInboundHandlerAdapter
 * 因为SimpleChannelInboundHandler中的channelRead()方法会自动释放接收到的来自于对方的msg所占有的所有资源，还没有用的时候就没有了。
 */
public class ClientHandler extends SimpleChannelInboundHandler<String> {

    //s的类型和SimpleChannelInboundHandler的泛型是一致的
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
        System.out.println(channelHandlerContext.channel().remoteAddress() + "." + s);
        channelHandlerContext.channel().writeAndFlush("from client:" + LocalDateTime.now());
        TimeUnit.MICROSECONDS.sleep(500);
    }

    //当Channel被激活后会触发该方法的执行
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.channel().writeAndFlush("from client: begin talking.");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
